Use case: USART TX in interrupt mode

Sequence diagram

USART transmit in interrupt mode

@startuml
participant "User Application" as p1
participant "HAL USART driver" as p2
participant "USARTX_IRQHandler" as p3
== USART HAL Transmit IT ==

p1->p2: <color: green> HAL_USART_Transmit_IT(&husart, aTxBuffer, DATA_TO_SEND_SIZE)
note over p2 #00FF00
Transmitting data ongoing
end note
p2-->p1: HAL_OK
p3<-: USARTX data interrupt
p3->p2: HAL_USART_IRQHandler
note over p2 #FFFF99
All data (Size == husart->TxXferCount) have been transmitted
end note
note over p2 #00FF00
End of transmitting data
end note
p2->p1: HAL_USART_TxCpltCallback(&husart->TxXferCount)

@enduml

Code snippet

HAL1

HAL2

#define DATA_TO_SEND_SIZE           256

uint8_t aTxBuffer[] = " **** USART_SlaveMode **** ";

USART_HandleTypeDef husart;

/* Ensure that all required peripherals
(USART, GPIO, NVIC,etc.) are configured properly
/*
...
*/

/* USART register Transmit complete user callback */
HAL_USART_RegisterCallback(&husart, HAL_USART_TX_CB_ID,
                               USART_TxCpltCallback);

/* Start a USART Process in interruption mode */
HAL_USART_Transmit_IT(&husart, aTxBuffer,
                              DATA_TO_SEND_SIZE)
#define DATA_TO_SEND_SIZE           256

uint8_t aTxBuffer[] = " **** USART_SlaveMode **** ";

hal_usart_handle_t husart;

/* Ensure that all required peripherals
(USART, GPIO, NVIC,etc.) are configured properly
/*
...
*/

/* USART register Transmit complete user callback */
HAL_USART_RegisterTxCpltCallback(&husart, USART_TxCpltCallback);


/* Start a USART Process in interruption mode */
HAL_USART_Transmit_IT(&husart, aTxBuffer,
                              DATA_TO_SEND_SIZE)

Key changes

  1. HAL2 provides a dedicated registration API for TX completion callbacks: HAL_USART_RegisterTxCpltCallback().

  2. HAL2 uses byte-oriented transfer count fields (for example tx_xfer_count).